/*
 * Copyright 2002-present the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.docs.dataaccess.jdbc.jdbccomplextypes

import oracle.jdbc.driver.OracleConnection
import org.springframework.jdbc.core.SqlTypeValue
import org.springframework.jdbc.core.support.AbstractSqlTypeValue
import java.sql.Connection
import java.sql.Date
import java.text.SimpleDateFormat

@Suppress("unused")
class SqlTypeValueFactory {

	fun createStructSample(): AbstractSqlTypeValue {
		// tag::struct[]
		val testItem = TestItem(123L, "A test item",
			SimpleDateFormat("yyyy-M-d").parse("2010-12-31"))

		val value = object : AbstractSqlTypeValue() {
			override fun createTypeValue(connection: Connection, sqlType: Int, typeName: String?): Any {
				val item = arrayOf<Any>(testItem.id, testItem.description,
					Date(testItem.expirationDate.time))
				return connection.createStruct(typeName, item)
			}
		}
		// end::struct[]
		return value
	}

	fun createOracleArray() : SqlTypeValue {
		// tag::oracle-array[]
		val ids = arrayOf(1L, 2L)
		val value: SqlTypeValue = object : AbstractSqlTypeValue() {
			override fun createTypeValue(conn: Connection, sqlType: Int, typeName: String?): Any {
				return conn.unwrap(OracleConnection::class.java).createOracleArray(typeName, ids)
			}
		}
		// end::oracle-array[]
		return value
	}

}